Количество часов: 2 часа.
Рейтинг: 2 балла.
Класс произвольного доступа к файлу RandomAccessFile может реализовывать интерфейсы как к DataInput, так и к DataOutput. Это означает, что класс RandomAccessFile может быть использован как для ввода данных из файла, так и для вывода в файл.
Для того чтобы создать объект класса RandomAccessFile, необходимо вызвать его конструктор с двумя параметрами: именем файла для ввода/вывода и режимом доступа к открываемому файлу. Так может выглядеть открытие файла для чтения информации:
new RandomAccessFile
("some.dat", "r");
А в следующем примере файл открывается как для чтения, так и для записи:
new RandomAccessFile
("some.dat", "rw");
После того как файл открыт, вы можете использовать любые методы readXXX()
и writeXXX() для ввода и вывода.
Основным же преимуществом класса RandomAccessFile является его способность читать и записывать данные в произвольное место файла. Программисты, работающие на Си и Си++, легко обнаружат, что в основе управления файлом лежит уже знакомый им файловый указатель, отмечающий текущую позицию, где происходит чтение или запись данных. В момент создания объекта класса RandomAccessFile файловый указатель устанавливается в начало файла и имеет значение 0. Вызовы методов readXXX() и writeXXX() обновляют позицию файлового указателя, сдвигая его на количество прочитанных (записанных) байтов. Для произвольного сдвига файлового указателя на некоторое количество байтов можно применить метод skipBytes(), или же установить файловый указатель в определенное место файла вызовом метода seek(). Для того чтобы узнать текущую позицию, в которой находится файловый указатель, нужно вызвать метод getFilePointer().
Помимо классов потоков ввода/вывода, описанных на этом занятии, существуют
еще несколько классов, о которых мы не сказали. Они не так часто употребляются
в программах Java, и поэтому вы можете отыскать их и освоить самостоятельно
в тот момент, когда они вам понадобятся.
Любой компонент, требующий показа на экране, должен быть добавлен в класс-контейнер. Контейнеры служат хранилищем для визульных компонентов интерфейса и других контейнеров. Простейший пример контейнера - класс Frame, объекты которого отображаются на экране как стандартные окна с рамкой.
Чтобы показать компонент пользовательского интерфейса в окне, требуется создать объект-контейнер, например окно класса Frame, создать требуемый компонент и добавить его в контейнер, а уже затем отобразить его на экране. Несмотря на столь длинный список действий, в исходном тексте этот процесс занимает всего несколько строк:
// Создается текстовый объект
с надписью "Строка"
Label text = new Label("Строка");
// Объект добавляется в некий контейнер
SomeContainer.add (text);
// Отображается контейнер
SomeContainer.Show();
...
Все достаточно просто. Лишь поясним метод add(). Этим методом и производится
собственно добавление элемента интерфейса в окно контейнера. В нашем примере
мы использовали самый простой вариант этого метода, принимающий единственный
аргумент-ссылку на вставляемый объект. Но есть еще два варианта метода
add() с двумя аргументами. В первом из них передаются порядковый номер
в списке управляющих элементов контейнера, куда будет вставлен добавляемый
элемент, и ссылка на вставляемый объект. Во втором варианте первый аргумент
- строка, указывающая место в окне, где должен быть размещен вставляемый
объект интерфейса, а второй - ссылка на вставляемый объект. Строк, допустимых
в качестве первого аргумента, всего пять: North, South, East, West и Center.
Подробнее мы рассмотрим их в разделе, посвященном раскладкам.
// Вставить элемент в окно контейнера
add(someControl);
// Вставить элемент после других
// элементов в контейнере
add(-1, someControl);
// Вставить элемент в окно контейнера
// у его верхней границы
add("North", someControl);
Само собой разумеется, коли есть методы для добавления визуальных элементов,
имеются и противоположные им методы, удаляющие элементы из окна контейнера.
Их два: метод удаления конкретного элемента remove(), принимающий в качестве
параметра ссылку на удаляемый объект, и метод удаления всех визуальных
компонентов removeAll().